package leetcode.interviewClassics;

import leetcode.ListNode;

/**
 * @author Cheng Jun
 * Description: 给定两个用链表表示的整数，每个节点包含一个数位。
 * <p>
 * 这些数位是反向存放的，也就是个位排在链表首部。
 * <p>
 * 编写函数对这两个整数求和，并用链表形式返回结果。
 * 输入：(7 -> 1 -> 6) + (5 -> 9 -> 2)，即617 + 295
 * 输出：2 -> 1 -> 9，即912
 * https://leetcode-cn.com/problems/sum-lists-lcci/
 * @version 1.0
 * @date 2021/11/1 20:32
 */
@Deprecated
// 写得又臭又长，没有参考价值。
// 感慨万千，我当时怎么写出来的。
public class addTwoNumbers {
    public static void main(String[] args) {

        // ListNode listNode2 = new ListNode(3);
        // ListNode listNode1 = new ListNode(4, listNode2);
        ListNode listNode0 = new ListNode(1, null);

        // ListNode listNode21 = new ListNode(4);
        ListNode listNode11 = new ListNode(9, null);
        ListNode listNode01 = new ListNode(9, listNode11);
        addTwoNumbers(listNode0, listNode01);
    }

    // 两个链表一起从头 遍历，遍历过程中 ，将同位置的数字相加 = x，然后这个位置都改成x的个数位数字，进一的时候下次 同位置就加上 1，
    // 最后位置如果进一，就要new ListNode = new ListNode（1）；
    static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // 是否进一标志
        boolean jin1 = false;
        ListNode curL1 = l1;
        ListNode curL2 = l2;
        while (curL1 != null && curL2 != null) {
            int sumForNode = jin1 ? curL1.val + curL2.val + 1 : curL1.val + curL2.val;
            if (sumForNode >= 10) {
                jin1 = true;
            } else {
                jin1 = false;
            }
            curL1.val = sumForNode % 10;
            curL2.val = sumForNode % 10;
            curL1 = curL1.next;
            curL2 = curL2.next;
        }
        if (curL1 != null) {
            while (curL1 != null) {
                if (jin1) {
                    int sumForNode = curL1.val + 1;
                    curL1.val = sumForNode % 10;
                    if (sumForNode >= 10) {
                        jin1 = true;
                    } else {
                        break;
                    }
                    if (curL1.next != null) {
                        curL1 = curL1.next;
                    } else {
                        curL1.next = new ListNode(1);
                        break;
                    }
                } else {
                    break;
                }
            }
            return l1;
        } else if (curL2 != null) {
            while (curL2 != null) {
                if (jin1) {
                    int sumForNode = curL2.val + 1;
                    curL2.val = sumForNode % 10;
                    if (sumForNode >= 10) {
                        jin1 = true;
                    } else {
                        break;
                    }
                    if (curL2.next != null) {
                        curL2 = curL2.next;
                    } else {
                        curL2.next = new ListNode(1);
                        break;
                    }
                } else {
                    break;
                }
            }
            return l2;
        } else {
            if (jin1) {
                ListNode l2Last = l2;
                while (l2Last.next != null) {
                    l2Last = l2Last.next;
                }
                l2Last.next = new ListNode(1);
            }
            return l2;
        }
    }
    // 暴力解法，将 a -> b -> c, e -> f, a + b * 10 + c* 100 + e + f * 10
}

